package com.chenwut.myreflect.a04_reflect_method;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * @author ChenPi
 * @since 2024/09/23 16:46
 */
public class MyReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        /**
         * Class类中用于获取成员方法的方法
         *
         * Method[] getMethods()                                                                 返回所有公共成员方法对象的数组，包括继承的
         * Method[] getDeclaredMethods()                                                         返回所有成员方法对象的数组，不包括继承的
         * Method getMethod(String name, Class<?>... parameterTypes）                            返回单个公共成员方法对象
         * Method getDeclaredMethod(String name, Class<?>... parameterTypes)                     返回单个成员方法对象
         *
         * Method类中用于创建对象的方法
         *
         * Object invoke(Object obj, Object.. args)                                              运行方法
         *
         * 参数一：用obj对象调用该方法
         * 参数二：调用方法的传递的参数（如果没有就不写）
         * 返回值：方法的返回值（如果没有就不写）
         */

        Class clazz = Class.forName("com.chenwut.myreflect.a04_reflect_method.Student");

        // Method[] methods = clazz.getDeclaredMethods();
        // for (Method method : methods) {
        //     System.out.println(method);
        // }

        Method method = clazz.getDeclaredMethod("eat", String.class);
        System.out.println(method);

        int modifiers = method.getModifiers();
        System.out.println(modifiers);

        // System.out.println(method.getName());
        //
        // System.out.println(method.getReturnType());
        //
        // System.out.println(method.getParameterCount());
        //
        // Class[] exceptionTypes = method.getExceptionTypes();
        // for (Class exceptionType : exceptionTypes) {
        //     System.out.println(exceptionType);
        // }
        //
        // Class[] types = method.getParameterTypes();
        // for (Class type : types) {
        //     System.out.println(type);
        // }

        Parameter[] parameters = method.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }

        /**
         *  方法运行
         *
         *  Object invoke(Object obj, Object.. args)    运行方法
         *
         *  参数一：用obj对象调用该方法
         *  参数二：调用方法的传递的参数（如果没有就不写）
         *  返回值：方法的返回值（如果没有就不写）
         */

        Student student = new Student();
        method.setAccessible(true);

        Object result = method.invoke(student, "西瓜");
        System.out.println(result);

    }
}
